Koa - микрофреймфорк, разработанный командой разработчиков фреймворка Express, и призванный использовать самые последние стандарты языка JavaScript.
Koa “предлагает” активно использовать синтаксис async/await
, который позволяет избавиться от ужасно нечитаемого “callback hell” и является более лучшей альтернативой Promise. Углубляться в синтаксис здесь не будем, это не тема статьи.
Сам Koa, являясь микрофреймворком, из коробки содержит только middleware систему, в нем даже нет маршрутизации. Все это можно получить, подключив необходимую функциональность в middleware chain.
Требования
Koa требует версию Node не меньше 7.6.0
.
Использовать более старые версии можно, если подключить Babel, но тогда немного теряется посыл самого Koa (см. выше).
Версия PostgreSQL нас не интересует, поставим самую последнюю.
Подготовка среды
Про Node.js
Если Node не установлен, то вам необходимо сюда. Если же у вас еще и Linux или macOS, можно установить через менеджер пакетов - здесь сказано, как.
Чтобы проверить, что с Node все в порядке, можно набрать команду:
1 | $ node --version |
Она выведет текущую версию Node.
Также и про NPM:
1 | $ npm --version |
Установка зависимостей
Создайте директорию проекта, где будет храниться весь код. Откройте терминал и перейдите в данную директорию.
Инициализируем среду пакета:
1 | $ npm init |
NPM задаст несколько вопросов. Отвечаем хотя бы на имя пакета и имя автора.
1 | $ npm init |
У нас должен был появиться файл package.json
.
Поставим koa
:
1 | $ npm i koa |
Также поставим что-то для роутинга запросов. Будем использовать koa-router
, как самый популярный и полнофункциональный вариант.
И заодно koa-logger
, чтобы видеть наши запросы на сервер в терминале.
1 | $ npm i koa-router koa-logger |
Для общения с базой будем использовать пакет node-postgres
. Это не ORM, а обычный драйвер с необходимой функциональностью. Его достаточно для микросервисов.
1 | $ npm i pg |
PostgreSQL
Скачать установщик PostgreSQL можно отсюда. Там же есть и уже и готовые бинарники в архиве, чтобы ничего не устанавливать, а просто распаковать, и имена пакетов для пакетных менеджеров.
Чтобы проверить, что все установилось верно, можно набрать команду:
1 | $ sudo -u postgres psql |
Или на Windows (если не создавали базу вручную, введите свое имя пользователя вместо стандартного postgres
):
1 | > psql -U postgres |
На Linux и macOS, как правило, база уже будет запущена сама.
На Windows же нужно все включить с пинка:
1 | > initdb -U postgres -D data |
Здесь postgres
- это имя пользователя, лучше его указать по умолчанию, для начала, а data
- директория, где будут храниться базы, можно указать любую удобную.
После чего pg_ctl
запускает PostgreSQL (с указанием директории с базами).
По окончанию, мы должны увидеть приветственную консоль:
1 | postgres=# |
Выйти из нее можно, набрав \q
.
По умолчанию за нас будет создана база postgres
. Нам этого достаточно для целей этого туторила.
Hello, World!
Создадим файл app.js
, и заполним его немного измененным стандартным примером Koa. Из кода достаточно все понятно.
1 | const Koa = require('koa'); |
Теперь можно запустить сервер:
1 | $ node app.js |
Если сервер успешно запустился, то можно зайти в браузер, и в адресной строке перейти по адресу http://localhost:3000/
. Мы должны увидеть приветствие. Также, если к адресу добавить имя, т.е. н-р http://localhost:3000/Nariman
, мы должны увидеть свое имя в ответе.
В терминале мы должны увидеть примерно такую картину:
1 | $ node app.js |
Теперь свяжемся с базой.
Мы будем сразу же использовать пул, а не отдельные подключения. Это распространенная практика, тем более для PostgreSQL. Пул позволяет хранить несколько соединений, тем самым не тратя время на их создание и не заниматься их менеджементом.
Добавим зависимость:
1 | const { Pool } = require('pg'); |
Перед запуском сервера, добавим код подключения к базе.
1 | app.pool = new Pool({ |
Немного изменим наши роуты, чтобы совершить запрос к базе.
1 | router.get('/', async (ctx) => { |
Сразу заметим, что Koa умеет преобразовывать результат в JSON, если в качестве ответа вернуть не строку. Если вернуть просто rows
, мы увидим JSON ответ.
Можно перезапустить сервер и увидеть результат.
Вместо заключения
Мы написали все в одном файле. Конечно же, уже для реального проекта, нужно составить правильную архитектуру проекта, а также позаботиться о закрытии пула PostgreSQL и соединений к Koa при выключении сервера.
В качестве инструмента для общения с базой можно использовать такие библиотеки, как Sequelize, Bookshelf, Massive, и другие.
References and useful links
- Node deps
- PostgreSQL
- How To Install and Use PostgreSQL on Ubuntu 16.04 (На русском)
- Building a RESTful API with Koa and Postgres
- Building A Server-Side Application With Async Functions and Koa 2
- Koa examples
- Koa wiki - набор ссылок на все то, чем можно обвесить Koa для расширения его функциональности.
- Awesome Node.js